/**
 * 动态规划，二维数组可以记录两个字符串所有比较的结果
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number}
 */
var findLength = function (nums1, nums2) {
    let len1 = nums1.length,
        len2 = nums2.length,
        dp = new Array(len1 + 1).fill(0).map(() => new Array(len2 + 1).fill(0)),
        max = 0;

    for (let i = 1; i <= len1; i++) {
        for (let j = 1; j <= len2; j++) {
            if (nums1[i - 1] === nums2[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1] + 1
                max = Math.max(max, dp[i][j])
            }
        }
    }

    return max
};



/**
 * 动态规划，二维数组优化为一维滚动数组
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number}
 */
var findLength = function (nums1, nums2) {
    let len1 = nums1.length,
        len2 = nums2.length,
        dp = new Array(len2 + 1).fill(0),
        max = 0;

    for (let i = 1; i <= len1; i++) {
        for (let j = len2; j >=1; j--) {
            if (nums1[i - 1] === nums2[j - 1]) {
                dp[j] = dp[j - 1] + 1
                max = Math.max(max, dp[j])
            }else{
                dp[j] = 0
            }
        }
    }

    return max
};